package org.apache.ibatis.executor;

import java.sql.SQLException;
import java.util.List;

import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.transaction.Transaction;

/**
 * @author Clinton Begin
 */
public interface Executor {

	ResultHandler NO_RESULT_HANDLER = null;

	int update(MappedStatement ms, Object parameter) throws SQLException;

	<E> List<E> query(MappedStatement ms, Object parameter,
			RowBounds rowBounds, ResultHandler resultHandler,
			CacheKey cacheKey, BoundSql boundSql) throws SQLException;

	<E> List<E> query(MappedStatement ms, Object parameter,
			RowBounds rowBounds, ResultHandler resultHandler)
			throws SQLException;

	List<BatchResult> flushStatements() throws SQLException;

	void commit(boolean required) throws SQLException;

	void rollback(boolean required) throws SQLException;

	CacheKey createCacheKey(MappedStatement ms, Object parameterObject,
			RowBounds rowBounds, BoundSql boundSql);

	boolean isCached(MappedStatement ms, CacheKey key);

	void clearLocalCache();

	void deferLoad(MappedStatement ms, MetaObject resultObject,
			String property, CacheKey key, Class<?> targetType);

	Transaction getTransaction();

	void close(boolean forceRollback);

	boolean isClosed();

	void setExecutorWrapper(Executor executor);

}
